package com.laoli.lab38;

import java.util.Random;
import java.util.concurrent.CompletableFuture;

/**
 * allOf()示例：多元AND聚合
 */
public class AllOfDemo {

    public static void main(String[] args) throws InterruptedException {
        // 问：任务A、任务B、任务C各出一个随机数(1-100)，任务D计算这三个随机数的和？
        // 关键：任务A、任务B、任务C、任务D都是异步任务

        // 异步任务A
        CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> new Random().nextInt(100) + 1);
        // 异步任务B
        CompletableFuture<Integer> taskB = CompletableFuture.supplyAsync(() -> {
            throw new RuntimeException("taskB Exception");
        });
        // 异步任务C
        CompletableFuture<Integer> taskC = CompletableFuture.supplyAsync(() -> new Random().nextInt(100) + 1);

        // 异步任务D(依赖任务A、任务B、任务C的结果)
        CompletableFuture<Void> taskD = CompletableFuture.allOf(taskA, taskB, taskC);
        taskD.thenApply(result->{//因为allOf不直接返回聚合结果，所以这里的result为null
            // 手动获取任务A、任务B、任务C的结果且结果聚合
            return taskA.join()+taskB.join()+ taskC.join();
        }).thenAccept(result->{
            System.out.println("result = " + result);
        });

        Thread.sleep(100);
    }
}
